package cn.lhjl.day10.note;
/*
* 注解：说明程序的。给计算机看的。
* 注释：用文字描述程序的，该程序员看的
*
* 定义：注解：也叫元数据。一种代码级别的说明。他是jdk1.5及之后引入的一个特性，与接口、类、枚举是在同一个层次。它可以声明包、类、
* 字段、方法、局部变量、方法参数等的前面，用来对这些元素进行说明，注释。
* 概况：
*   1.JDK1.5之后的新特性
*   2.说明程序的
*   3使用注解：@注解名称
* 作用分类：
*   1.编写文档：通过代码里标识的注解生成文档【javadoc -d doc -encoding UTF-8 -charset UTF-8 *.java】
*   2.代码分析：通过代码里标识的注解对代码进行分析【使用反射】
*   3.编译检查：通过代码里标识的注解让编译器能够实现基本的编译检查例如【Override】
*
* JDK中预定义的一些注解
* @Override：检测该标注的方法是否是继承自父类（接口）的，如果不是会编译报错
* @Deprecated:JDk作者强烈不建议再使用，表示已经过时
* @SuppressWarnings：压制警告，使用方法：@SuppressWarnings("all"),让开发工具不再警报，例如命名没有遵守驼峰规则，变量没有被使用过
*
* 反编译：我们虽然很难将机器语言反编译成源代码，但是，我们还是可以把中间代码进行反编译的。
* 就像我们虽然不能把经过虚拟机编译后的机器语言进行反编译，但是我们把javac编译得到的class进行反编译还是可行的
*
* 反编译作用：用于java学习，因为Java作为一种编程语言，提供了很多语法糖，如泛型、自动装箱与拆箱等，而这些语法糖Java虚拟机是不认识的
* ，所以在javac编译的时候，就会进行解糖，而得到的class文件中就是解糖后的代码，这时候我们把这种解糖后的class文件进行反编译，
* 就可以得到一份java文件，从这份java文件中，我们就可以学习到这些语法糖到底是如何实现的
*
* 反编译语法（jdk自带的也可用其他工具）javap 文件名.class
*
* 自定义注解：
* 格式：
*   元注解
*   public @interface 注解名称{}
* 本质：public interface MyAnno extends java.lang.annotation.Annotation
*
* 属性：接口中的抽象方法
*
* 要求：
* 1.属性的返回值类型有下列值
*   基本数据类型
*   String
*   枚举
*   注解
*   以上类型的数组
*
* 2.定义了属性，再使用时需要给属性赋值(元注解的和以下不同)
*   1.如果定义属性时，使用了default关键字给属性默认初始值，则再使用注解时，可以不进行属性的赋值。
*   2.如果一个属性需要赋值，并且属性的名称是value，则value可省略，直接定义值即可。
*   3.数组赋值时，使用{}包裹，如果数组中只有一个值，则{}省略
*
* 3.元注解：用于描述注解的注解
* @Target：描述注解能够作用的位置
*   ElementType取值：
*       TYPE：可以作用于类上
*       METHOD：可以作用于方法上
*       FIELD：可以作用于成员变量上
* @Retention：描述注解被保留的阶段
*   @Retention（RetentionPolicy.RUNTIME）:当前被描述的注解，会保留到class字节码文件中，并被JVM读到
* @Documented：描述注解是否被抽取到api文档中
* @Inherited：描述注解是否被子类继承
*
* 在程序使用注解：获取注解定义的属性值
*   1.获取注解定义的位置的对象（Class，Method，Field）
*   2.获取指定的注解
*       获取方式：getAnnotation(Class)，这个方法执行后，会在内存中生成一个该注解接口的子类实现对象
*       public class MyAnnoImpl implements MyAnno{
*           public String className(){
*               return "cn.........(使用注解时给的值)";
*           }
*           public String methodName(){
*               return "game(使用注解时给的值)";
*           }
*       }
*   3.调用自定义注解的实现类对象中的重写方法获取配置的属性值。
*
* 和配置文件加载数据比较，注解是紧耦合，配置文件是松耦合，使用场景不同
*
* */
public class 注解 {
}
